package org.wdcode.core.factory;

import java.util.concurrent.ConcurrentMap;

import org.wdcode.common.tools.Maps;
import org.wdcode.common.util.CommonUtil;

/**
 * 拥有Key功能的工厂基础实现 根据Key生成单例
 * @author WD
 * @since JDK6
 * @version 1.0 2010-09-01
 */
public abstract class BaseKeyFactory<K, E> extends BaseFactory<E> implements KeyFactory<K, E> {
	// 产品仓库
	protected ConcurrentMap<K, E>	map;

	public BaseKeyFactory() {
		// 生成产品仓库
		map = Maps.getConcurrenrMap();
	}

	/**
	 * 获得实例 单例模式
	 * @param key 根据Key获得实例
	 * @return 获得实例
	 */
	public final E getInstance(K key) {
		// 获得产品
		E e = map.get(key);
		// 判断是否为空
		if (CommonUtil.isEmpty(e)) {
			// 同步琐
			lock.lock();
			// 判断是否为空
			if (CommonUtil.isEmpty(e)) {
				// 生成新的实例
				e = newInstance(key);
				// 添加到仓库中
				map.put(key, e);
			}
			// 解锁
			lock.unlock();
		}
		// 返回
		return e;
	}
}
